package com.yuxl.admin.manager.auth.core.service;

import com.yuxl.admin.manager.auth.core.entity.AuthOperate;
import com.yuxl.admin.manager.auth.core.entity.AuthRole;
import com.yuxl.admin.manager.auth.core.repository.AuthOperateRepository;
import com.yuxl.admin.manager.auth.core.repository.AuthRolePowerRepository;
import com.yuxl.admin.manager.auth.core.repository.AuthRoleRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.LocalDateTime;

@Service
@RequiredArgsConstructor
public class AuthOperateService {
    private final AuthOperateRepository authOperateRepository;
    private final AuthRolePowerRepository authRolePowerRepository;
    private final AuthRoleRepository authRoleRepository;
    /**
     * 创建新操作
     * @param entity 要创建的操作对象
     * @return 创建成功的操作对象
     */
    public Mono<AuthOperate> create(AuthOperate entity) {
        // 保存新操作到数据库
        entity.setCreateTime(LocalDateTime.now());
        return authOperateRepository.save(entity);
    }

    /**
     * 根据ID获取操作
     * @param id 操作ID
     * @return 操作对象
     */
    public Mono<AuthOperate> getById(Long id) {
        return authOperateRepository.findById(id);
    }

    /**
     * 更新操作信息
     * @param id 要更新的操作ID
     * @param entity 包含更新信息的操作对象
     * @return 更新后的操作对象
     */
    public Mono<AuthOperate> update(Long id,AuthOperate entity) {
        return authOperateRepository.findById(id)
                // 根据ID查找现有操作
                .flatMap(existingRole -> {
                    entity.setId(id);
                    entity.setUpdateTime(LocalDateTime.now());
                    // 更新操作信息
                    return authOperateRepository.save(entity);
                    // 保存更新后的操作
                });
    }

    /**
     * 删除操作
     * @param id 要删除的操作ID
     * @return 无返回值
     */
    public Mono<Void> delete(Long id) {
        return authOperateRepository.deleteById(id);
    }

    /**
     * 获取所有操作
     * @return 所有操作的列表
     */
    public Flux<AuthOperate> getAll() {
        return authOperateRepository.findAll();
    }

    /**
     * 获取操作数量
     * @return 符合条件的操作数量
     */
    public Mono<Long> count() {
        return authOperateRepository.count();
    }

    /**
     * 分页获取操作
     * @param page 页码
     * @param size 每页大小
     * @return 分页后的操作列表
     */
    public Flux<AuthOperate> getPage(int page,int size) {
        return authOperateRepository.findAll()
                // 获取所有操作
                .skip((long) page * size)
                // 跳过前面的操作
                .take(size)
                ;
    }

    /**
     * 获取操作的角色
     * @param operateId 操作ID
     * @return 拥有指定操作的用户列表
     */
    public Flux<AuthRole> getRoles(Long operateId) {
        if (operateId != null) {
            return
                    authRolePowerRepository.findByOperateId(operateId)
                            // 根据操作ID查找用户操作关系
                            .flatMap(roleOperate -> authRoleRepository.findById(roleOperate.getRoleId()))
                    ;
            // 根据用户ID查找用户
        }else{
            return Flux.empty();
        }
    }
}
